# @Time : 2024-10-24 13:40
# @Author : Fioman 
# @Phone : 13149920693
"""
自省(Introspection) 是一种在运行的时候可以动态检查对象类型,属性和方法的能力.
Python作为动态语言,提供了丰富的自省功能,可以在运行的时候通过内置函数和特殊属性了解
对象的类型,结构和特性.
通过自省,程序可以在不知道对象具体类型的情况下,动态获取其属性,方法,类型等信息.广泛应用于调试,
动态对象操作,反射等场景.
python对象在内部中存储有元数据,这些元数据包括对象的类型,属性,和方法等.
可以通过type(),dir(),__dict__,getattr(),hasattr() 等工具实现对象的动态属性查询和操作
"""


class Person:
    classVal = "类变量"

    def __init__(self, name):
        self.name = name

    def print_name(self):
        print(self.name)

    @classmethod
    def class_func(cls):
        print(cls.classVal)

    @staticmethod
    def static_func():
        print(Person.classVal)


p = Person("Fioman")
print(dir(p))  # dir(obj) 会列出对象所有可以访问的属性和方法,包括继承于父类的
print(p.__dict__)  # 只包含实例变量和对象的值 {'name': 'Fioman'}
print(Person.__dict__)  # 这个就很多了,包括类变量还有实例方法,为什么实例方法存储在类中
# 因为方法是存储在类中的,而不是每个实例单独拥有一份.实例是通过类来访问方法的,而不是将方法
# 存储在实例对象中
# 记住实例的__dict__只存储实例属性(实例变量) 不包括类的普通方法和类方法静态方法
